home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 May: Tool Chest / Developer CD Series May 1996 (Tool Chest) (Apple Computer) (1996).iso / Sample Code / Snippets / Development Tools & Languages / ShowBalloon XFCN / ShowBalloon.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-18  |  2.6 KB  |  63 lines  |  [TEXT/MPS ]

  1. /* A simple XFCN that calls HMShowBalloon with the appropriate parameters. */
  2. /* Usage: ShowBalloon(type,content,tip,rect)
  3. /* Written by Paul Snively, MacDTS. */
  4. /* Thanks to Neil Day for helping w/the C and putting up with my whining. */
  5.  
  6. #include <types.h>
  7. #include <balloons.h>
  8. #include <hyperxcmd.h>
  9.  
  10. pascal void EntryPoint (XCmdPtr paramPtr)        // Standard XFCN function declaration
  11. {
  12.     OSErr                anOSErr;                // What we ultimately return to HyperCard
  13.     HMMessageRecord        anHMMessage;            // What it is that we wish to have in the balloon
  14.     Rect                aRect;                    // The alternateRect for HMShowBalloon
  15.     long                *aPtr;                    // So we can play fast and loose with anHMMessage
  16.     Str255                aStr;                    // A Pascal-style string for lotsa temp stuff
  17.     Point                aPoint;                    // Where the tip of the balloon should be
  18.     Handle                aHandle;                // For the value to return to HyperCard
  19.  
  20. /* Parameter 0 is the type (a number), so we convert C string to Pascal, and then to a long */
  21.     ZeroToPas(paramPtr,(StringPtr) *(paramPtr->params[0]),&aStr);
  22.     anHMMessage.hmmHelpType = StrToLong(paramPtr, &aStr);
  23. /* anHMMessage is a union; if we point to it via a long *, we get away with everything we need */
  24.     aPtr = (long *) &anHMMessage.u;
  25. /* There are three cases: moving a string, storing a short, storing a long */
  26.     switch (anHMMessage.hmmHelpType) {
  27.         case khmmString:
  28.             ZeroToPas(paramPtr, (StringPtr) *(paramPtr->params[1]), (StringPtr) aPtr);
  29.             break;
  30.         case khmmPict:
  31.         case khmmTERes:
  32.         case khmmSTRRes:
  33.             ZeroToPas(paramPtr, (StringPtr) *(paramPtr->params[1]), &aStr);
  34.             *aPtr = StrToLong(paramPtr, &aStr) << 0x10;
  35.             break;
  36.         case khmmTEHandle:
  37.         case khmmStringRes:
  38.         case khmmPictHandle:
  39.             ZeroToPas(paramPtr, (StringPtr) *(paramPtr->params[1]), &aStr);
  40.             *aPtr = StrToLong(paramPtr, &aStr);
  41.             break;
  42.     }
  43.     
  44. /* Next comes the tip (a Point), which must be in global coordinates */
  45.     ZeroToPas(paramPtr, (StringPtr) *(paramPtr->params[2]), &aStr);
  46.     StrToPoint(paramPtr, &aStr, &aPoint);
  47.     LocalToGlobal(&aPoint);
  48.  
  49. /* Finally, the alternateRect, which must also be in global coordinates.  StrToRect is SLOW */
  50.     ZeroToPas(paramPtr, (StringPtr) *(paramPtr->params[3]), &aStr);
  51.     StrToRect(paramPtr, &aStr, &aRect);
  52.     LocalToGlobal((Point *) &aRect.top);
  53.     LocalToGlobal((Point *) &aRect.bottom);
  54.  
  55. /* Finally, we can call the Help Manager using no proc, balloon def, etc. and without saving bits */
  56.     anOSErr = HMShowBalloon(&anHMMessage,aPoint,&aRect,NULL,NULL,NULL,false);
  57.  
  58. /* Next we massage the OSErr into a zero-terminated string to return to HyperCard */
  59.     NumToStr(paramPtr, (long) anOSErr, &aStr);
  60.     aHandle = PasToZero(paramPtr, &aStr);
  61.     paramPtr->returnValue = aHandle;
  62. }
  63.